package com.example.demo.AOP;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;


/**
 * @Configuration 用于声明一个Spring管理配置Bean;
 * @Aspect 用于声明一个切面类;
 * @Around 声明一个表达式，要织入的方法;
 * @within 表示被织入的目标（还有其他注解如：@execution,@target,可参考Spring官网）;
 */
@Configuration
@Aspect
public class AOPConfig {
    //织入被@RestController注解的类
    @Around("@within(org.springframework.web.bind.annotation.RestController)")
    public Object simpleAOP(final ProceedingJoinPoint pjp) throws Throwable{
        try{
            //执行切面的动作
            Object [] args = pjp.getArgs();
            System.out.println("args:"+Arrays.asList(args));
            //调用原有应用本身的方法
            Object o = pjp.proceed();
            System.out.println("return :"+o);
            return o;
        }catch (Throwable e){
            throw e;
        }
    }
}
